/**
 * common/util.js
 * 公共功能模块
 */

//导入debug模块
const debug = require("debug")("mylab-server:[debug]");
const error = require("debug")("mylab-server:[error]");
//导入加密的模块
const crypto = require("crypto");
const config = require("./config");


/**
 * JSONData数据类型说明
 * 
 * @typedef {Object} JSONData
 * @property {Number} code - 返回自定义的状态码
 * @property {String} msg - 返回自定义的提示信息
 * @property {Object | Array} data - 返回自定义的数据
 * 
 */

/**
 * 格式化json数据
 * 
 * 200 - 成功
 * 201 - 新增资源提示
 * 202 - 更新资源提示
 * 204 - 删除资源提示
 * 400 - 参数错误
 * 401 - 认证失败无授权访问
 * 
 * @param {Number} code - 返回自定义的状态码
 * @param {String} msg 
 * @param {Object | Array} data 
 * @returns {JSONData}
 */
function FormatJSONData(code,msg="",data=[]){
    if(!data){
        data=[];
    }
    return {
        code:code,
        msg:msg,
        data:data
    }
}

/**
 * 调试信息
 * @param {String} msg - 调试信息
 */
function log(msg) {
    debug(msg);
}
 
/**
 * 带格式调试信息
 * @param {String} formatter - 带格式占位符的字符串例如 %O,%j
 * @param {Object} data - 数据对象
 */
function logFormat(formatter, data) {
    debug(formatter, data);
}
 
/**
 * 错误信息
 * @param {String} msg - 错误信息
 */
function err(msg) {
    error(msg);
}
 
/**
 * 生成MD5后的密码
 * @param {String} pwd 密码
 * @returns {String} 16进制密码串
 */
function md5pwd(pwd){
    let salt = config.salt;
    let md5= crypto.createHash('md5');
    return md5.update(pwd+salt).digest('hex');
}

/**
 * 
 * @param {Express.Request} req请求
 * @returns 
 */
function getReqRemoteIP(req) {
    return (req.headers['x-forwarded-for'] || "").split(",")[0] || req.ip;
}
module.exports = {
    FormatJSONData,
    log,
    logFormat,
    err,
    md5pwd,
    getReqRemoteIP
};